home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / ASSOC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-18  |  5.2 KB  |  244 lines

  1. #include "assoc.h"
  2.  
  3. #if !defined(_lint)
  4. static char rcsid[] OPTIONAL = "$Id: assoc.c,v 1.11 1997/08/19 01:19:22 root Exp root $";
  5. #endif
  6.  
  7. #ifdef TEST
  8. #define tprintf    printf
  9. #define        NULLCHAR        ((char *)0)
  10. #else
  11. #include "global.h"
  12. #endif
  13.  
  14. static char assocstr[] = "%-*.*s : %s\n";
  15.  
  16. static AarrayPtr assoc_alloc (AarrayPPtr pool, int sorted, char *label);
  17. static int assoc_add (AarrayPPtr pool, char *label, char *value, int length, int sorted);
  18. #if 0    /* not used, yet */
  19. static void assoc_clr (AarrayPPtr pool);
  20. static void assoc_sort (AarrayPtr pool);
  21.  
  22.  
  23.  
  24. void
  25. assoc_sort (AarrayPtr pool)
  26. {
  27. AarrayPtr aa;
  28. int didone;
  29. char *tmp;
  30.  
  31.     do    {
  32.         didone = 0;
  33.         for (aa = pool; aa && aa->next; aa = aa->next)    {
  34.             if (strcmp (aa->name, aa->next->name) > 0)    {
  35.                 tmp = aa->name;
  36.                 aa->name = aa->next->name;
  37.                 aa->next->name = tmp;
  38.                 tmp = (char *)aa->macro;
  39.                 aa->macro = aa->next->macro;
  40.                 aa->next->macro = (unsigned char *)tmp;
  41.                 didone = 1;
  42.             }
  43.         }
  44.     } while (didone);
  45. }
  46. #endif
  47.  
  48.  
  49. unsigned char *
  50. assoc_lookup (AarrayPtr pool, char *label)
  51. {
  52. AarrayPtr aa;
  53.  
  54.     if ((aa = assoc_find (pool, label)) == NULLASSOC)
  55.         return (unsigned char *)0;
  56.     else
  57.         return aa->macro;
  58. }
  59.  
  60.  
  61. AarrayPtr
  62. assoc_find (AarrayPtr pool, char *label)
  63. {
  64. AarrayPtr aa;
  65.  
  66.     if (label == NULLCHAR)
  67.         return NULLASSOC;
  68.     for (aa = pool; aa; aa = aa->next)
  69.         if (!strcmp (label, aa->name))
  70.             return aa;
  71.     return NULLASSOC;
  72. }
  73.  
  74.  
  75. void
  76. assoc_list (AarrayPtr pool, int maxlen, char *label)
  77. {
  78. AarrayPtr aa = NULLASSOC;
  79.  
  80.     if (pool == NULLASSOC)
  81.         return;
  82.     if (label != NULLCHAR)
  83.         aa = assoc_find (pool, label);
  84.     if ((label == NULLCHAR) || aa != NULLASSOC)
  85.         tprintf (assocstr, maxlen, maxlen, "Name","Macro definition");
  86.     if (label != NULLCHAR)    {
  87.         if (aa != NULLASSOC)
  88.             tprintf (assocstr, maxlen, maxlen, aa->name, (char *) aa->macro);
  89.     } else    {
  90.         for (aa = pool; aa; aa = aa->next)
  91.             tprintf (assocstr, maxlen, maxlen, aa->name, (char *) aa->macro);
  92.     }
  93. }
  94.  
  95. int
  96. assoc_addstr (AarrayPPtr pool, char *label, char *value, int sorted)
  97. {
  98. int len;
  99.  
  100.     len = (int) strlen (value);
  101.     if (!len)
  102.         return (assoc_free (pool, label));
  103.     else
  104.         return (assoc_add (pool, label, value, (int) (strlen(value) + 1), sorted));
  105. }
  106.  
  107.  
  108. static int
  109. assoc_add (AarrayPPtr pool, char *label, char *value, int length, int sorted)
  110. {
  111. AarrayPtr aa;
  112.  
  113.     if ((aa = assoc_find (*pool, label)) == NULLASSOC)    {
  114.         aa = assoc_alloc (pool, sorted, label);
  115.         if (aa == NULLASSOC)
  116.             return 0;
  117.         aa->name = strdup (label);
  118.     }
  119.     if (aa->macro)
  120.         free (aa->macro);
  121.     aa->macro = (unsigned char *)mallocw (strlen (value) + 1);
  122.     memcpy (aa->macro, value, (unsigned int)length);
  123.     return 1;
  124. }
  125.  
  126.  
  127. static AarrayPtr
  128. assoc_alloc (AarrayPPtr pool, int sorted, char *label)
  129. {
  130. AarrayPtr aa;
  131.  
  132.     aa = (AarrayPtr) callocw (sizeof (Aarray), 1);
  133.     if (aa != NULLASSOC)    {
  134.         if (!sorted)    {
  135.             aa->next = *pool;
  136.             if (*pool)
  137.                 (*pool)->prev = aa;
  138.             *pool = aa;
  139.         } else    {
  140.             AarrayPtr ap;
  141.             for (ap = *pool; ap; ap = ap->next)    {
  142.                 if (strcmp (label, ap->name) <= 0)    {
  143.                     aa->next = ap;
  144.                     aa->prev = ap->prev;
  145.                     if (ap->prev)
  146.                         ap->prev->next = aa;
  147.                     else
  148.                         *pool = aa;
  149.                     ap->prev = aa;
  150.                     break;
  151.                 }
  152.                 if (ap->next == NULLASSOC)    {
  153.                     ap->next = aa;
  154.                     aa->prev = ap;
  155.                     break;
  156.                 }
  157.             }
  158.             if (*pool == NULLASSOC)
  159.                 *pool = aa;
  160.         }
  161.     }
  162.     return aa;
  163. }
  164.  
  165.  
  166. #if 0
  167. static void
  168. assoc_clr (AarrayPPtr pool)
  169. {
  170.     while (*pool != NULLASSOC)
  171.         (void) assoc_free (pool, (*pool)->name);
  172. }
  173. #endif
  174.  
  175.  
  176. int
  177. assoc_free (AarrayPPtr pool, char *label)
  178. {
  179. AarrayPtr aa, ap;
  180.  
  181.     if ((aa = assoc_find (*pool, label)) == NULLASSOC)
  182.         return 0;
  183.     free (aa->name);
  184.     free (aa->macro);
  185.     ap = aa->prev;
  186.     if (ap != NULLASSOC)    {
  187.         ap->next = aa->next;
  188.         if (aa->next)
  189.             aa->next->prev = ap;
  190.     } else    {    /* first one in list */
  191.         *pool = aa->next;
  192.         if (*pool)
  193.             (*pool)->prev = NULLASSOC;
  194.     }
  195.     free (aa);
  196.     return 1;
  197. }
  198.  
  199. #ifdef TEST
  200.  
  201. AarrayPtr Home = NULLASSOC;
  202. #define sortit 1
  203. #define llen 15
  204.  
  205. void
  206. main (void)
  207. {
  208.     setbuf (stdout, NULL);
  209.     printf ("Initial listing:\n");
  210.     assoc_list (Home, llen, NULLCHAR);
  211.     putchar ('\n');
  212.     assoc_addstr (&Home, "Test1", "Value1", sortit);
  213.     assoc_addstr (&Home, "Test2", "Value2", sortit);
  214.     assoc_addstr (&Home, "Test3", "Value3", sortit);
  215.     assoc_addstr (&Home, "Test4", "Value4", sortit);
  216.     assoc_list (Home, llen, NULLCHAR);
  217.     putchar ('\n');
  218. #if 0
  219.     assoc_sort (Home);
  220.     printf ("Now sorted...\n");
  221.     assoc_list (Home, llen, NULLCHAR);
  222.     putchar ('\n');
  223. #endif
  224.     assoc_addstr (&Home, "Test1", "Value1b", sortit);
  225.     assoc_addstr (&Home, "Test2", "Value2b", sortit);
  226.     assoc_addstr (&Home, "Test3", "Value3b", sortit);    
  227.     assoc_addstr (&Home, "Test4", "Value4b", sortit);    
  228.     assoc_list (Home, llen, NULLCHAR);
  229.     putchar ('\n');
  230.     assoc_free (&Home, "Test1");
  231.     assoc_free (&Home, "Test5");
  232.     assoc_list (Home, llen, NULLCHAR);
  233.     putchar ('\n');
  234.     printf ("looking for deleted Test1...\n");
  235.     assoc_list (Home, llen, "Test1");
  236.     printf ("looking for Test3...\n");
  237.     assoc_list (Home, llen, "Test3");
  238.     printf ("Test4's value is %s\n", assoc_lookup (Home, "Test4"));
  239.     assoc_clr (&Home);
  240.     printf ("Printing empty list:\n");
  241.     assoc_list (Home, llen, NULLCHAR);
  242. }
  243. #endif
  244.